www.gusucode.com > VC++ 多声道MP3录音实时压缩保存程序-源码程序 > VC++ 多声道MP3录音实时压缩保存程序-源码程序/code/HwAudioRecDlg.cpp
// HwAudioRecDlg.cpp : implementation file // Download by http://www.NewXing.com #include "stdafx.h" #include "HwAudioRec.h" #include "HwAudioRecDlg.h" #include <io.h> #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHwAudioRecDlg dialog CHwAudioRecDlg::CHwAudioRecDlg(CWnd* pParent /*=NULL*/) : CDialog(CHwAudioRecDlg::IDD, pParent) , m_nAudioDevicePos ( -1 ) { //{{AFX_DATA_INIT(CHwAudioRecDlg) m_nChannels = 0; m_nWaveInDevice = 0; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CHwAudioRecDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CHwAudioRecDlg) DDX_Control(pDX, IDC_SLIDER_Microphone, m_Slider_Microphone); DDX_Control(pDX, IDC_SLIDER_LineIn, m_Slider_LineIn); DDX_Radio(pDX, IDC_RADIO_MONO, m_nChannels); DDX_Radio(pDX, IDC_RADIO_Microphone, m_nWaveInDevice); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CHwAudioRecDlg, CDialog) //{{AFX_MSG_MAP(CHwAudioRecDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_REC, OnButtonRec) ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop) ON_BN_CLICKED(IDC_BUTTON_PLAY, OnButtonPlay) ON_BN_CLICKED(IDC_BUTTON_COMPACT, OnButtonCompact) ON_BN_CLICKED(IDC_CHECK_WAVE, OnCheckWave) ON_BN_CLICKED(IDC_CHECK_MP3, OnCheckMp3) ON_BN_CLICKED(IDC_CHECK_LEFT, OnCheckLeft) ON_BN_CLICKED(IDC_CHECK_RIGHT, OnCheckRight) ON_BN_CLICKED(IDC_RADIO_MONO, OnRadioChannel) ON_BN_CLICKED(IDC_RADIO_Microphone, OnRADIOWaveInDevice) ON_CBN_SELCHANGE(IDC_COMBO_AUDIO_DEVICE, OnSelchangeComboAudioDevice) ON_BN_CLICKED(IDC_RADIO_LineIn, OnRADIOWaveInDevice) ON_BN_CLICKED(IDC_RADIO_STEREO, OnRadioChannel) ON_BN_CLICKED(IDC_RADIO_ALONE, OnRadioChannel) ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_LineIn, OnReleasedcaptureSLIDERLineIn) ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_Microphone, OnReleasedcaptureSLIDERMicrophone) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CallbackNotify ( UINT uWaveMsg, WPARAM wParam ) { CHwAudioRecDlg *pDlg = reinterpret_cast<CHwAudioRecDlg*>(wParam); ASSERT ( pDlg ); if ( uWaveMsg == MM_WIM_CLOSE || uWaveMsg == MM_WOM_CLOSE ) { pDlg->EnableCtrls (); } } // // 如果指定了文件名就直接返回,否则打开一个对话框来让用户选择一个文件 // CString CHwAudioRecDlg::GetFileName ( BOOL bOpen, LPCTSTR lpszTitle, LPCTSTR lpszFileName/*=NULL*/, char *szFilter/*=NULL*/ ) { if ( lpszFileName && strlen(lpszFileName) > 0 && ( ( bOpen && _access ( lpszFileName, 0 ) == 0 ) || !bOpen ) ) { return lpszFileName; } char szCurDir[MAX_PATH] = {0}; DWORD dwRet = ::GetModuleFileName(NULL,(LPTSTR)szCurDir,sizeof(szCurDir)); if ( szCurDir[dwRet-1] != '\\' ) strncat ( szCurDir, "\\", sizeof(szCurDir) ); CFileDialog FileDlg ( bOpen, ".wav", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, NULL ); // FileDlg.m_ofn.lpstrInitialDir = szCurDir; FileDlg.m_ofn.lpstrTitle = LPSTR ( lpszTitle ); if ( FileDlg.DoModal () != IDOK ) return ""; return FileDlg.GetPathName(); } ///////////////////////////////////////////////////////////////////////////// // CHwAudioRecDlg message handlers BOOL CHwAudioRecDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here // 得到所有的声卡设备 for ( UINT i=0; i<m_Audio.GetWaveInCount(); i++ ) { ( (CComboBox*)GetDlgItem(IDC_COMBO_AUDIO_DEVICE) )->AddString ( m_Audio.GetWaveInName ( i ) ); } int nAvailableDeviceIndex = m_Audio.GetAvailableDeviceIndex (); ( (CComboBox*)GetDlgItem(IDC_COMBO_AUDIO_DEVICE) )->SetCurSel ( nAvailableDeviceIndex ); m_nAudioDevicePos = nAvailableDeviceIndex; // 初始化音频对象 CRect rc; GetDlgItem(IDC_STATIC_AUDIO)->GetWindowRect ( &rc ); ScreenToClient ( &rc ); if ( !m_Audio.Init ( ( (CComboBox*)GetDlgItem(IDC_COMBO_AUDIO_DEVICE) )->GetCurSel (), 1024*4, GetSafeHwnd(), &rc, CallbackNotify, (WPARAM)this ) ) MessageBox ( "Initialize callback device failed" ); // 初始化音量控制控件 SetVolume ( IDC_SLIDER_Microphone ); SetVolume ( IDC_SLIDER_LineIn ); m_Audio.SetWaveInDevice ( FALSE, m_Slider_Microphone.GetPos() ); // 初始化其他控件 GetDlgItem(IDC_STATIC_Note)->SetWindowText ( NOTE_AudioPlayRec ); ( (CButton*)GetDlgItem(IDC_CHECK_LEFT) )->SetCheck ( TRUE ); ( (CButton*)GetDlgItem(IDC_CHECK_RIGHT) )->SetCheck ( TRUE ); ( (CButton*)GetDlgItem(IDC_CHECK_WAVE) )->SetCheck ( TRUE ); ( (CButton*)GetDlgItem(IDC_CHECK_MP3) )->SetCheck ( TRUE ); EnableCtrls (); return TRUE; // return TRUE unless you set the focus to a control } void CHwAudioRecDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CHwAudioRecDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CHwAudioRecDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CHwAudioRecDlg::OnButtonRec() { UpdateData ( TRUE ); BOOL bRet = m_Audio.Record ( (CAudioPlayRec::ENUM_REC_CHANNEL)m_nChannels, 11025*2, 16 ); AddSaveAudioFile (); EnableCtrls (); } void CHwAudioRecDlg::OnButtonStop() { m_Audio.Stop (); EnableCtrls (); } void CHwAudioRecDlg::OnOK() { if ( m_Audio.GetStatus () == CAudioPlayRec::ENUM_STATUS_PLAYING || m_Audio.GetStatus () == CAudioPlayRec::ENUM_STATUS_RECORDING || m_Audio.GetStatus () == CAudioPlayRec::ENUM_STATUS_STOPING ) { AfxMessageBox ( "Busing" ); return; } CDialog::OnOK(); } void CHwAudioRecDlg::OnButtonPlay() { CString csFileName = GetFileName ( TRUE, "打开文件来播放", NULL, "Wave files(*.wav)|*.wav||" ); if ( csFileName.IsEmpty() ) return; m_Audio.Play ( csFileName ); EnableCtrls (); } void CHwAudioRecDlg::EnableCtrls() { UpdateData ( TRUE ); BOOL bEnable = !( m_Audio.GetStatus () == CAudioPlayRec::ENUM_STATUS_PLAYING || m_Audio.GetStatus () == CAudioPlayRec::ENUM_STATUS_RECORDING || m_Audio.GetStatus () == CAudioPlayRec::ENUM_STATUS_STOPING ); GetDlgItem(IDC_RADIO_MONO)->EnableWindow ( bEnable ); GetDlgItem(IDC_RADIO_STEREO)->EnableWindow ( bEnable ); GetDlgItem(IDC_RADIO_ALONE)->EnableWindow ( bEnable ); GetDlgItem(IDC_BUTTON_REC)->EnableWindow ( bEnable ); GetDlgItem(IDC_BUTTON_PLAY)->EnableWindow ( bEnable ); GetDlgItem(IDC_COMBO_AUDIO_DEVICE)->EnableWindow ( bEnable ); bEnable = ( m_nChannels == (int)CAudioPlayRec::ENUM_REC_CHANNEL_ALONE ); GetDlgItem(IDC_CHECK_LEFT)->EnableWindow ( bEnable ); GetDlgItem(IDC_CHECK_RIGHT)->EnableWindow ( bEnable ); } void CHwAudioRecDlg::OnButtonCompact() { ::ShellExecute ( NULL,_T("open"), "mailto:chrys@163.com", NULL,NULL,SW_SHOW ); } void CHwAudioRecDlg::OnCheckWave() { CheckCtrlClicked ( IDC_CHECK_WAVE ); } void CHwAudioRecDlg::OnCheckMp3() { CheckCtrlClicked ( IDC_CHECK_MP3 ); } void CHwAudioRecDlg::CheckCtrlClicked ( UINT uSaveCheckCtrlID ) { if ( ( (CButton*)GetDlgItem(uSaveCheckCtrlID) )->GetCheck() ) AddSaveAudioFile (); else StopRecordAudioFile (); } BOOL CHwAudioRecDlg::AddSaveAudioFile () { BOOL bSaveToWav = ( (CButton*)GetDlgItem(IDC_CHECK_WAVE) )->GetCheck(); BOOL bSaveToMp3 = ( (CButton*)GetDlgItem(IDC_CHECK_MP3) )->GetCheck(); if ( bSaveToWav ) { if ( !AddSaveAudioFile ( "wav" ) ) return FALSE; } if ( bSaveToMp3 ) { if ( !AddSaveAudioFile ( "mp3" ) ) return FALSE; } return TRUE; } BOOL CHwAudioRecDlg::AddSaveAudioFile ( CString csExtName ) { UpdateData ( TRUE ); if ( m_Audio.GetStatus () != CAudioPlayRec::ENUM_STATUS_RECORDING ) return FALSE; // 录制单独通道 if ( m_nChannels == CAudioPlayRec::ENUM_REC_CHANNEL_ALONE ) { BOOL bLeft = ( (CButton*)GetDlgItem(IDC_CHECK_LEFT) )->GetCheck(); BOOL bRight = ( (CButton*)GetDlgItem(IDC_CHECK_RIGHT) )->GetCheck(); if ( bLeft ) { if ( !m_Audio.StartRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_LEFT, "test_left."+csExtName ) ) return FALSE; } if ( bRight ) { if ( !m_Audio.StartRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_RIGHT, "test_right."+csExtName ) ) return FALSE; } } else { if ( !m_Audio.StartRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_COMMON, "test."+csExtName ) ) return FALSE; } return TRUE; } void CHwAudioRecDlg::StopRecordAudioFile () { BOOL bStopWav = !( (CButton*)GetDlgItem(IDC_CHECK_WAVE) )->GetCheck(); BOOL bStopMp3 = !( (CButton*)GetDlgItem(IDC_CHECK_MP3) )->GetCheck(); BOOL bStopLeft = !( (CButton*)GetDlgItem(IDC_CHECK_LEFT) )->GetCheck(); BOOL bStopRight = !( (CButton*)GetDlgItem(IDC_CHECK_RIGHT) )->GetCheck(); // 终止左声道录音文件 if ( m_nChannels == CAudioPlayRec::ENUM_REC_CHANNEL_ALONE && bStopLeft ) { m_Audio.StopRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_LEFT, "wav" ); m_Audio.StopRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_LEFT, "mp3" ); } // 终止右声道录音文件 if ( m_nChannels == CAudioPlayRec::ENUM_REC_CHANNEL_ALONE && bStopRight ) { m_Audio.StopRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_RIGHT, "wav" ); m_Audio.StopRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_RIGHT, "mp3" ); } // 终止wave录音文件 if ( bStopWav ) { m_Audio.StopRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_LEFT, "wav" ); m_Audio.StopRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_RIGHT, "wav" ); } // 终止mp3录音文件 if ( bStopMp3 ) { m_Audio.StopRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_LEFT, "mp3" ); m_Audio.StopRecordAudioFile ( CAudioPlayRec::ENUM_FILE_CHANNEL_RIGHT, "mp3" ); } } void CHwAudioRecDlg::OnCheckLeft() { CheckCtrlClicked ( IDC_CHECK_LEFT ); } void CHwAudioRecDlg::OnCheckRight() { CheckCtrlClicked ( IDC_CHECK_RIGHT ); } void CHwAudioRecDlg::OnRadioChannel() { EnableCtrls (); } void CHwAudioRecDlg::OnRADIOWaveInDevice() { UpdateData ( TRUE ); m_Audio.SetWaveInDevice ( m_nWaveInDevice==1 ); CSliderCtrl *pSliderCtrl = (m_nWaveInDevice==1) ? &m_Slider_LineIn : &m_Slider_Microphone; pSliderCtrl->SetPos ( pSliderCtrl->GetRangeMax() ); } void CHwAudioRecDlg::SetVolume ( UINT nSliderID ) { CSliderCtrl *pSliderCtrl = (nSliderID==IDC_SLIDER_LineIn) ? &m_Slider_LineIn : &m_Slider_Microphone; DWORD dwMaxVolume, dwMinVolume; DWORD dwCurrentVolume = m_Audio.GetWaveInVolume ( nSliderID==IDC_RADIO_LineIn, &dwMaxVolume, &dwMinVolume ); pSliderCtrl->SetRange ( dwMinVolume, dwMaxVolume ); pSliderCtrl->SetTicFreq ( dwMaxVolume / 15 ); pSliderCtrl->SetPos ( (int) dwCurrentVolume ); } void CHwAudioRecDlg::OnSelchangeComboAudioDevice() { int nCurSel = ( (CComboBox*)GetDlgItem(IDC_COMBO_AUDIO_DEVICE) )->GetCurSel (); if ( nCurSel == m_nAudioDevicePos ) return; m_Audio.SetDeviceID ( nCurSel ); m_nAudioDevicePos = nCurSel; } void CHwAudioRecDlg::OnReleasedcaptureSLIDERLineIn(NMHDR* pNMHDR, LRESULT* pResult) { m_Audio.SetWaveInDevice ( TRUE, m_Slider_LineIn.GetPos() ); *pResult = 0; } void CHwAudioRecDlg::OnReleasedcaptureSLIDERMicrophone(NMHDR* pNMHDR, LRESULT* pResult) { m_Audio.SetWaveInDevice ( FALSE, m_Slider_Microphone.GetPos() ); *pResult = 0; }